在前一篇中,我們已經了解父組件向子組件傳遞資料了,接著來認識子組件向父組件的溝通吧
this.$emit("在父層所定義的綁定事件名稱", 要傳送過去的參數);
所以我們銜接上一篇的例子來修改,以下
<div id="app">
<counter :message="msg"></counter>
{{ receive }}
</div>
<script>
Vue.component("counter",{
template:`
<div>
<p>子組件拿到了父組件的資料 -- {{ message }}</p>
<div>
<button @click='returnData'>子組件回送</button>
</div>
</div>
`,
props: ['message'],
data() {
return {
text: "我已收到,謝謝"
}
},
methods:{
returnData(){
// 子組件
this.$emit("responsedata", this.text);
}
}
});
var app = new Vue({
el: '#app',
data:{
msg: "我是父組件要傳送的包裹",
receive: "尚無子組件訊息"
}
})
</script>
假想畫面會是 透過 button 回送資料給 父組件
所以我們必需去定義父組件的接收
<div id="app">
<counter :message="msg" @responsedata="父組件接收到後要去執行的 function "></counter>
{{ receive }}
</div>
繼續修改我們的範例程式碼
<div id="app">
<counter :message="msg" @responsedata="getChildMessage"></counter>
{{ receive }}
</div>
<script>
Vue.component("counter",{
template:`
<div>
<p>子組件拿到了父組件的資料 -- {{ message }}</p>
<div>
<button @click='returnData'>子組件回送</button>
</div>
</div>
`,
props: ['message'],
data() {
return {
text: "我已收到,謝謝"
}
},
methods:{
returnData(){
this.$emit("responsedata", this.text);
}
}
});
var app = new Vue({
el: '#app',
data:{
msg: "我是父組件要傳送的包裹",
receive: "尚無子組件訊息"
},
methods:{
getChildMessage(context){
this.receive = context;
}
}
})
</script>
注意
當我們定義父層的接收 $emit
( @自定義名稱="父層 function名稱" )
,自定義名稱最好是全小寫
,自己實測是 camelCase (駝峰命名法) 跟 kebab-case (短橫線分隔命名) 都會失敗 (如果有誤再麻煩糾正 )
最後完成我們的範例啦~ 當我們點擊回送按鈕後,父層會將接到的訊息更新到畫面~
Vue 官方文件 通过 Prop 向子组件传递数据
Vue 官方文件 Prop
Lilybon Blog Vue.js - 組件間溝通
跟著 Vue 闖蕩前端世界 - 06 父子組件溝通 pass props / emit event, 搞搞就懂
父子組件溝通原則
Component 的溝通方式 :props Day 14, iT邦幫忙 閃光洽